#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;

void Print(const sigset_t &pending){
    for (int signo = 31; signo >= 1; signo--){
        cout << sigismember(&pending, signo);
    }
    cout << endl;
}

void handler(int signo){
    cout << "catch a signo: " << signo << endl;
}

int main(){
    // 0. 捕捉2号信号
    signal(2, handler);
    // 1. 先对2号信号进行屏蔽
    sigset_t bset, oset;
    sigemptyset(&bset);
    sigemptyset(&oset);
    sigaddset(&bset, 2);    //此时只是在用户层面上将信号集中的2号信号屏蔽，并没有设置到进程的block位图中
    
    // 1.2 调用系统调用，将数据设置进内核中
    sigprocmask(SIG_SETMASK, &bset, &oset);

    // 2. 重复打印当前进程的未决信号集
    sigset_t pending;
    int cnt = 0;
    while (true)
    {
        // 2.1 调用系统调用获取进程的pending位图
        int n = sigpending(&pending);
        if (n < 0){
            continue;
        }
        // 2.2 打印pending信号集
        Print(pending);

        sleep(1);
        cnt++;

        // 2.3 解除阻塞
        if(cnt==20){
            cout << "unblock 2 signo" << endl;
            sigprocmask(SIG_SETMASK, &oset, nullptr);
        }
    }

    // 3. 发送2号信号

    return 0;
}